#include "model.h"



void Model::readMesh_OFF( QString myFileString_Mesh )
{

        QFile myFileIN( myFileString_Mesh );
        myFileIN.open(QIODevice::ReadOnly);

        if(!myFileIN.isOpen())
        {
            ErrorManager::error(3, myFileString_Mesh);
            return;
        }

        QTextStream myStream(&myFileIN);

        ////////////////////////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////////////////////////

        QString dummyString;
        int     dummyInt;

        myStream >> dummyString;
        myStream >> totalVertices;
        myStream >> totalTriangles;
        myStream >> dummyInt;

        ////////////////////////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////////////////////////

        mesh.vertices.clear();              mesh.vertices.resize(         totalVertices);
        mesh.verticesWeighted.clear();      mesh.verticesWeighted.resize( totalVertices);
        mesh.normals_Vertices.clear();      mesh.normals_Vertices.resize( totalVertices);
        mesh.normals_Triangles.clear();     mesh.normals_Triangles.resize(totalTriangles);
        mesh.triangles.clear();             mesh.triangles.resize(        totalTriangles);

        ////////////////////////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////////////////////////

        for (int vvv=0; vvv<totalVertices; vvv++)
        {
            mesh.vertices[        vvv] = Eigen::Vector3d::Zero();
            mesh.verticesWeighted[vvv] = Eigen::Vector3d::Zero();
        }

        ////////////////////////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////////////////////////

        for (int vvv=0; vvv<totalVertices; vvv++)
        {
                myStream >> mesh.vertices[vvv](0);
                myStream >> mesh.vertices[vvv](1);
                myStream >> mesh.vertices[vvv](2);
        }

        ////////////////////////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////////////////////////

        for (int tr=0; tr<totalTriangles; tr++)
        {
                myStream >> dummyInt;
                myStream >> mesh.triangles[tr].vertexID_1;
                myStream >> mesh.triangles[tr].vertexID_2;
                myStream >> mesh.triangles[tr].vertexID_3;
        }

        ////////////////////////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////////////////////////

        myFileIN.close();

}




void Model::print_Mesh_Vertices()
{

        std::cout << totalVertices << std::endl << std::endl;

        for (int vvv=0; vvv<totalVertices; vvv++)
        {
            std::cout << vvv << "\t" << mesh.vertices[vvv](0) << "\t" << mesh.vertices[vvv](1) << "\t" << mesh.vertices[vvv](2) << std::endl;
        }

        std::cout << std::endl << std::endl;

}


void Model::print_Mesh_Triangles()
{

        std::cout << totalTriangles << std::endl << std::endl;

        for (int tr=0; tr<totalTriangles; tr++)
        {
            std::cout << tr << "\t" << mesh.triangles[tr].vertexID_1 << "\t" << mesh.triangles[tr].vertexID_2 << "\t" << mesh.triangles[tr].vertexID_3 << std::endl;
        }

        std::cout << std::endl << std::endl;

}



/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////






void Model::compute_NORMALS()
{

        ///////////////////////////////////////////////////////
        ///////////////////////////////////////////////////////
        mesh.normals_Vertices. fill( Eigen::Vector3d::Zero() );
        mesh.normals_Triangles.fill( Eigen::Vector3d::Zero() );
        ///////////////////////////////////////////////////////
        ///////////////////////////////////////////////////////

        for (int tr=0; tr<totalTriangles; tr++)
        {

                int vertexIndex_1 = mesh.triangles[tr].vertexID_1;
                int vertexIndex_2 = mesh.triangles[tr].vertexID_2;
                int vertexIndex_3 = mesh.triangles[tr].vertexID_3;

                Eigen::Vector3d VertexA;
                Eigen::Vector3d VertexB;
                Eigen::Vector3d VertexC;
                Eigen::Vector3d vect_1;
                Eigen::Vector3d vect_2;
                Eigen::Vector3d currNormal;

                VertexA << mesh.verticesWeighted[vertexIndex_1];   //  0
                VertexB << mesh.verticesWeighted[vertexIndex_2];   //  1
                VertexC << mesh.verticesWeighted[vertexIndex_3];   //  2

                vect_1 = VertexB - VertexA;   // 1 - 0
                vect_2 = VertexC - VertexA;   // 2 - 0

                currNormal = vect_1.cross(vect_2);

                currNormal.normalize();

                /////////////////////////////////////////////////////
                mesh.normals_Triangles[      tr      ]  = currNormal;
                /////////////////////////////////////////////////////
                mesh.normals_Vertices[ vertexIndex_1 ] += currNormal;
                mesh.normals_Vertices[ vertexIndex_2 ] += currNormal;
                mesh.normals_Vertices[ vertexIndex_3 ] += currNormal;
                /////////////////////////////////////////////////////

        }

        ///////////////////////////////////////////////////////////////////////////////////////
        ///////////////////////////////////////////////////////////////////////////////////////
        for (int vvv=0; vvv< totalVertices; vvv++)      mesh.normals_Vertices[vvv].normalize();
        ///////////////////////////////////////////////////////////////////////////////////////
        ///////////////////////////////////////////////////////////////////////////////////////

}



/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


